﻿using System;

namespace LAPI.Business.Acciones
{
    /// <summary>
    /// Clase para realizar la acción: Recordar contraseña al usuario
    /// </summary>
    public class AccRecordarPasswordUsuario
    {
        /// <summary>
        /// Logger
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public AccRecordarPasswordUsuario()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(AccRecordarPasswordUsuario));
        }

        /// <summary>
        /// Método para realizar la acción de recordar la contraseña del usuario
        /// <p>
        /// El método realiza las siguientes funciones:
        /// <ul>
        /// <li>Verifica que exista el email para algun usuario activo</li>  
        /// <li>Obtiene los datos del usuario al que corresponde el email</li>
        /// <li>Envia un correo electrónico al email</li>
        /// </ul>
        /// </p>
        /// </summary>
        /// <param name="datosUsuario">Modelo con los datos del usuario con el email</param>
        /// <returns>ResultadoAccion, con el resultado de la operación</returns>
        /// <seealso cref="Usuario"/>
        /// <seealso cref="GestorUsuarios"/>
        /// <seealso cref="ResultadoAccion"/>
        /// <seealso cref="TipoResultado"/>
        /// <seealso cref="TipoMensaje"/>
        /// <seealso cref="ClientSMTPFactory"/>
        /// <seealso cref="ClientSMTP"/>
        public ResultadoAccion RecordarPasswordUsuario(LAPI.Data.Model.Usuario datosUsuario)
        {
            logger.Debug("[RecordarPasswordUsuario] Comienzo");
            logger.Debug("[RecordarPasswordUsuario] Datos:" + datosUsuario);

            ResultadoAccion res = new ResultadoAccion();

            try
            {
                Gestores.GestorUsuarios oUsuarios = new Gestores.GestorUsuarios();
                //1. Verificamos que exista el email para algun usuario activo
                if (oUsuarios.ComprobarEmail(datosUsuario: datosUsuario))
                {
                    res.addMensaje(mensaje: "No hay ningún usuario registrado con esa dirección de correo.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }
               
                //2. Obtenemos los datos del usuario
                LAPI.Data.Model.Usuario datos = oUsuarios.ObtenerPorEmail(email: datosUsuario.Email);

                //3. Enviamos el email
                var cliente = LAPI.Core.Mail.ClientSMTPFactory.getClientSMTP();
                if (!cliente.sendBasicEmail(
                        asunto: "Recordatorio de contraseña",
                        body: "<p>Sus credenciales de acceso a LAPI son:<ul><li>Usuario -> " + datos.User + "</li><li>Contraseña -> " + datos.Password + "</li></ul></p>",
                        destinatario: datosUsuario.Email,
                        titulo: "Servicio de recordatorio de contraseña de LAPI"
                    ))
                {
                    res.addMensaje(mensaje: "Ha habido algún error al enviar el correo.<br> Por favor, Intentelo de nuevo más tarde.", tipoMensaje: TipoMensaje.ERROR);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //TODO OK
                res.setResultado(TipoResultado.CORRECTO);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                res.addMensaje(mensaje: "No ha sido posible recordar la contraseña.", tipoMensaje: TipoMensaje.ERROR);
                res.setResultado(TipoResultado.ERROR);
            }

            logger.Debug("[RecordarPasswordUsuario] Fin");
            return res;
        }
    }
}
